#include <REGX52.H>

sbit OneWire_DQ=P3^7;
/**
  * @brief  初始化
  * @param  
  * @retval 
  */
unsigned char OneWire_Init(void){
	unsigned char i;
	unsigned char AckBit;
	OneWire_DQ=1;//先保证高电位
	OneWire_DQ=0;//在拉低
	i = 227;while (--i);//Delay500us
	OneWire_DQ=1;//释放总线
	i = 29;while (--i);//Delay70us
	AckBit=OneWire_DQ;//读取从机应答状态
	i = 227;while (--i);//Delay500us
	return AckBit;
}

/**
  * @brief  发送一位
  * @param  
  * @retval 
  */
void OneWire_SendBit(unsigned char Bit){
	unsigned char i;
	OneWire_DQ=0;
	i = 4;while (--i);//Delay10us
	OneWire_DQ=Bit;
	i = 20;while (--i);//Delay50us
	OneWire_DQ=1;//结束释放总线
}

/**
  * @brief  接收一位  
  * @param  
  * @retval 
  */
unsigned char OneWire_ReceiveBit(void){
	unsigned char i;
	unsigned char Bit;
	OneWire_DQ=0;//先拉低5us 在释放总线 在延迟5um 读取端口电平 延迟50um
	i = 2;while (--i);//Delay5us
	OneWire_DQ=1;//释放总线
	i = 2;while (--i);//Delay5us
	Bit=OneWire_DQ;
	i = 20;while (--i);//Delay50us
	return Bit;
}

/**
  * @brief  发送一个字节
  * @param  
  * @retval 
  */
void OneWire_SendByte(unsigned char Byte){
	unsigned char i;
	for(i=0;i<8;i++){
		OneWire_SendBit(Byte&(0x01<<i));
	}
}

/**
  * @brief 接收一个字节
  * @param  
  * @retval 
  */
unsigned char OneWire_ReceiveByte(void){
	unsigned char i;
	unsigned char Byte=0x00;
	for(i=0;i<8;i++){
		if(OneWire_ReceiveBit()){Byte|=(0x01<<i);}
	}
	return Byte;
}